package com.ev.apis.controller.hr;

import com.ev.framework.annotation.EvApiByToken;
import com.ev.framework.utils.R;
import com.ev.hr.service.SalaryAccountingService;
import com.ev.hr.vo.SalaryAccountingPageParam;
import com.ev.hr.vo.SalaryAccountingVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

/**
 * 文件名称： com.ev.hr.SalaryAccountingApiController.java</br>
 * 初始作者： ev-monitor</br>
 * 创建日期： 2020-05-08 09:50:23</br>
 * 功能说明： 薪资核算 <br/>
 * =================================================<br/>
 * 修改记录：<br/>
 * 修改作者        日期       修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2020-2021 .All rights reserved.<br/>
 */

@Api(value = "/",tags = "薪资核算API")
@RestController
public class SalaryAccountingApiController {

	/**
	 * 薪资核算 服务类
	 */
	@Autowired
	private SalaryAccountingService salaryAccountingService;

	/**
	 * 方法描述: [根据条件分页查询薪资核算.]</br>
	 * 初始作者: ev-monitor<br/>
	 * 创建日期: 2020-05-08 09:50:23<br/>
	 * 开始版本: 1.0.0<br/>
	 * =================================================<br/>
	 * 修改记录：<br/>
	 * 修改作者 日期 修改内容<br/>
	 * ================================================<br/>
	 *
	 * @param pageParam 分页参数
	 * @return R 响应对象
	 */
	@EvApiByToken(value = "/apis/salaryAccounting/pageList", method = RequestMethod.POST, apiTitle = "根据条件分页查询薪资核算")
	@ApiOperation(value = "根据条件分页查询薪资核算", produces = MediaType.APPLICATION_JSON_VALUE)
	public R pageList(@Valid @RequestBody @ApiParam("薪资核算分页列表参数对象") SalaryAccountingPageParam pageParam) {
		return R.ok(this.salaryAccountingService.pageList(pageParam));
	}

	/**
	 * 方法描述: [根据单位与所属时期获取对应薪资，假如对应薪资不存在则，新建薪资数据再返回页面薪资数据.]</br>
	 * 初始作者: ev-monitor<br/>
	 * 创建日期: 2020-05-08 09:50:23<br/>
	 * 开始版本: 1.0.0<br/>
	 * =================================================<br/>
	 * 修改记录：<br/>
	 * 修改作者 日期 修改内容<br/>
	 * ================================================<br/>
	 *
	 * @param pageParam 输入所属时期
	 * @return R 响应对象
	 */
	@EvApiByToken(value = "/apis/salaryAccounting/getSalaryAccountingData", method = RequestMethod.POST, apiTitle = "根据单位与所属时期获取对应薪资，假如对应薪资不存在则，新建薪资数据再返回页面薪资数据")
	@ApiOperation(value = "根据单位与所属时期获取对应薪资，假如对应薪资不存在则，新建薪资数据再返回页面薪资数据", produces = MediaType.APPLICATION_JSON_VALUE)
	public R getSalaryAccountingData(@Valid @RequestBody @ApiParam("输入所属时期") SalaryAccountingPageParam pageParam) {
		return this.salaryAccountingService.getSalaryAccountingData(pageParam);
	}


	/**
	 * 方法描述: [根据id获取薪资核算.]</br>
	 * 初始作者: ev-monitor<br/>
	 * 创建日期: 2020-05-08 09:50:23<br/>
	 * 开始版本: 1.0.0<br/>
	 * =================================================<br/>
	 * 修改记录：<br/>
	 * 修改作者 日期 修改内容<br/>
	 * ================================================<br/>
	 *
	 * @param id 主键
	 * @return R 响应对象
	 */
	@EvApiByToken(value = "/apis/salaryAccounting/detail/{id}", method = RequestMethod.GET, apiTitle = "根据id获取薪资核算")
	@ApiOperation("根据id获取薪资核算")
	public R detail(@PathVariable("id") @ApiParam("id") Long id) {
		return R.ok(this.salaryAccountingService.getById(id));
	}
	/**
	 * 方法描述: [根据所属时期审核薪资核算.]</br>
	 * 初始作者: ev-monitor<br/>
	 * 创建日期: 2020-05-09 09:50:23<br/>
	 * 开始版本: 1.0.0<br/>
	 * =================================================<br/>
	 * 修改记录：<br/>
	 * 修改作者 日期 修改内容<br/>
	 * ================================================<br/>
	 *
	 * @param param 查询参数
	 * @return R 响应对象
	 */
	@EvApiByToken(value = "/apis/salaryAccounting/audit", method = RequestMethod.POST, apiTitle = "根据所属时期审核薪资核算")
	@ApiOperation("根据所属时期审核薪资核算")
	public R audit(@Valid @RequestBody @ApiParam("输入所属时期:monthDate") SalaryAccountingPageParam param) {
		return this.salaryAccountingService.audit(param,true);
	}
	/**
	 * 方法描述: [根据所属时期反审核薪资核算.]</br>
	 * 初始作者: ev-monitor<br/>
	 * 创建日期: 2020-05-09 09:50:23<br/>
	 * 开始版本: 1.0.0<br/>
	 * =================================================<br/>
	 * 修改记录：<br/>
	 * 修改作者 日期 修改内容<br/>
	 * ================================================<br/>
	 *
	 * @param param 查询参数
	 * @return R 响应对象
	 */
	@EvApiByToken(value = "/apis/salaryAccounting/antiAudit", method = RequestMethod.POST, apiTitle = "根据所属时期反审核薪资核算")
	@ApiOperation("根据所属时期反审核薪资核算")
	public R antiAudit(@Valid @RequestBody @ApiParam("输入所属时期:monthDate") SalaryAccountingPageParam param) {
		return this.salaryAccountingService.audit(param,false);
	}

	/**
	 * 方法描述: [批量删除]</br>
	 * 初始作者: ev-monitor<br/>
	 * 创建日期: 2020-05-08 09:50:23<br/>
	 * 开始版本: 1.0.0<br/>
	 * =================================================<br/>
	 * 修改记录：<br/>
	 * 修改作者 日期 修改内容<br/>
	 * ================================================<br/>
	 *
	 * @param ids ID组
	 * @return R 响应对象
	 */
	@EvApiByToken(value = "/apis/salaryAccounting/batchRemove", method = RequestMethod.POST, apiTitle = "批量删除")
	@ApiOperation(value = "批量删除", notes = "批量删除", produces = MediaType.APPLICATION_JSON_VALUE)
	@Transactional(rollbackFor = Exception.class)
	public R batchRemove(@RequestBody @ApiParam("批量删除") List<Long> ids){
		Long[] idsToLong = ids.toArray(new Long[0]);
		return this.salaryAccountingService.batchRemove(idsToLong)>0?R.ok():R.error();
	}

	/**
	 * 方法描述: [保存薪资核算.]</br>
	 * 初始作者: ev-monitor<br/>
	 * 创建日期: 2020-05-08 09:50:23<br/>
	 * 开始版本: 1.0.0<br/>
	 * =================================================<br/>
	 * 修改记录：<br/>
	 * 修改作者 日期 修改内容<br/>
	 * ================================================<br/>
	 *
	 * @param saveParam 薪资核算参数
	 * @return R 响应对象
	 */
	@Transactional(rollbackFor = Exception.class)
	@EvApiByToken(value = "/apis/salaryAccounting/save", method = RequestMethod.POST, apiTitle = "保存薪资核算")
	@ApiOperation("保存薪资核算")
	public R save(@Valid @RequestBody @ApiParam("保存薪资核算对象") List<SalaryAccountingVO> saveParam){
		return this.salaryAccountingService.saveAndVerify(saveParam);
	}

	/**
	 * 方法描述: [数据计算.]</br>
	 * 初始作者: ev-monitor<br/>
	 * 创建日期: 2020-05-08 09:50:23<br/>
	 * 开始版本: 1.0.0<br/>
	 * =================================================<br/>
	 * 修改记录：<br/>
	 * 修改作者 日期 修改内容<br/>
	 * ================================================<br/>
	 *
	 * @param param 数据计算参数
	 * @return R 响应对象
	 */
	@Transactional(rollbackFor = Exception.class)
	@EvApiByToken(value = "/apis/salaryAccounting/compute", method = RequestMethod.POST, apiTitle = "数据计算")
	@ApiOperation("数据计算")
	public R compute(@Valid @RequestBody @ApiParam("薪资核算参数(只需要所属时期:monthDate、公式:formulaId)") SalaryAccountingPageParam param){
		return this.salaryAccountingService.compute(param);
	}
}
